# -*- coding: utf-8 -*-
# Author: xiantingDeng
# File: elements.py
# Time: 9:15

import allure
from airtest.aircv import aircv
from airtest.core.api import *

from common.element.devices import OriginalEquipment


class PocoElement():
    '''
    页面元素操作
    '''

    def __init__(self, poco, log):
        self.__log = log
        self.__poco = poco
        self.equipment = OriginalEquipment(log)

    def poco_element_exists(self, element, timeout=5, ignore_error=False):
        '''
        检测元素是否存在
        :param method: 检测方法
        :param element: 带检测元素
        :param timeout: 超时时间
        :param msg: 待检测元素
        :return: 返回元素
        '''
        incident = element.get("incident")
        describe = element.get("describe")
        method = element.get("method")
        with allure.step("{}：检测元素是否存在".format(describe)):
            try:
                if method == "name":
                    if self.__poco(incident).wait(timeout).exists():
                        return element
                    else:
                        return False
                else:
                    if self.__poco(text=incident).wait(timeout).exists():
                        return element
                    else:
                        return False
            except Exception as e:
                if not ignore_error:
                    raise

    def click_on_the_element(self, element, timeout=5):
        '''
        点击页面元素
        :param element: 待点击元素
        :param msg: 元素描述
        :return: 返回成功或失败
        '''
        incident = element.get("incident")
        describe = element.get("describe")
        method = element.get("method")
        with allure.step("{}:进行元素点击".format(describe)):
            try:
                if method == "name":
                    if self.poco_element_exists(element=element, timeout=timeout):
                        self.__poco(incident).click()
                        self.__log.info("{}:进行元素点击完成".format(describe))
                    else:
                        self.__log.warning("当前界面没有找到--【{}】元素".format(describe))
                        # todo 缺少一个异常处理
                else:
                    if self.poco_element_exists(element=element, timeout=timeout):
                        self.__poco(text=incident).click()
                        self.__log.info("{}：进行元素点击完成".format(describe))
                        # todo 缺少一个异常处理
                    else:
                        self.__log.warning("当前界面没有找到--【{}】元素".format(describe))
            except Exception as e:
                self.__log.error("{}：点击失败，错误原因：{}".format(describe, e))

    def double_click_on_the_element(self, element, timeout=5):
        '''
        双击页面元素
        :param element: 待点击元素
        :param msg: 元素描述
        :return: 返回成功或失败
        '''
        incident = element.get("incident")
        describe = element.get("describe")
        method = element.get("method")
        with allure.step("{}:进行元素点击".format(describe)):
            try:
                if method == "name":
                    if self.poco_element_exists(element=element, timeout=timeout):
                        self.__poco(incident).doble()
                        self.__log.info("{}:进行元素点击完成".format(describe))
                    else:
                        self.__log.warning("当前界面没有找到--【{}】元素".format(describe))
                        # todo 缺少一个异常处理
                else:
                    if self.poco_element_exists(element=element, timeout=timeout):
                        self.__poco(text=incident).click()
                        self.__log.info("{}：进行元素点击完成".format(describe))
                        # todo 缺少一个异常处理
                    else:
                        self.__log.warning("当前界面没有找到--【{}】元素".format(describe))
            except Exception as e:
                self.__log.error("{}：点击失败，错误原因：{}".format(describe, e))

    def poco_smart_click(self, element, timeout=5):
        '''
        智能点击
        :param element: 待点击元素
        :param msg: 元素描述
        :return:
        '''
        incident = element.get("incident")
        describe = element.get("describe")
        getmethod = element.get("method")
        with allure.step("{}:进行元素智能点击".format(describe)):
            try:
                if getmethod == "name":
                    if self.poco_element_exists(element=element, timeout=timeout):
                        self.__poco(incident).click()
                        self.__log.info("{}:进行元素点击完成".format(describe))
                else:
                    if self.poco_element_exists(element=element, timeout=timeout):
                        self.__poco(text=incident).click()
                        self.__log.info("{}：进行元素点击完成".format(describe))
            except Exception as e:
                self.__log.error("{}:点击失败，错误原因：{}".format(describe, e))

    def click_clear_contents(self, element, timeout=5):
        '''
        点击后，清除该内容
        :param element: 待点击清除元素
        :param text: 定位方法，默认为none
        :param name: 定位方法，默认为none
        :param msg: 待操作元素描述
        :param timeout: 超时时间，默认为5秒
        :return:
        '''
        incident = element.get("incident")
        describe = element.get("describe")
        method = element.get("method")
        with allure.step("点击{}，并清除内容".format(describe)):
            try:
                if method == "name":
                    if self.poco_element_exists(element=element, timeout=timeout):
                        self.__poco(incident).click()
                        len = len(self.get_text_content(element=element, timeout=timeout))
                        for i in range(len):
                            keyevent("DEL")
                        self.__log.info("{}元素点击成功，并成功清除内容".format(describe))
                    else:
                        self.__log.warning("当前界面没有找到--【{}】元素".format(describe))
                else:
                    if self.poco_element_exists(element=element, timeout=timeout):
                        self.__poco(text=incident).click()
                        len = len(self.get_text_content(element=element, timeout=timeout))
                        for i in range(len):
                            keyevent("DEL")
                        self.__log.info("{}元素点击成功，并成功清除内容".format(describe))
                    else:
                        self.__log.warning("当前界面没有找到--【{}】元素".format(describe))
            except Exception as e:
                self.__log.error("{}步骤出现异常，异常原因：".format(describe) + str(e))
                # todo 缺少一个异常处理

    def click_input_contents(self, element, inputtext, timeout=5):
        '''
        点击后输入内容
        :param element: 待操作元素
        :param importTxt: 待输入内容
        :param msg: 待操作元素描述
        :param timeout: 超时时间，默认为5秒
        :return:
        '''
        incident = element.get("incident")
        describe = element.get("describe")
        method = element.get("method")
        with allure.step("点击{}，且输入内容：{}".format(describe, inputtext)):
            try:
                if method == "name":
                    if self.poco_element_exists(element=element, timeout=timeout):
                        self.__poco(incident).set_text(inputtext)
                        self.__log.info("{}元素点击成功，并成功输入：{}".format(describe, inputtext))
                    else:
                        self.__log.warning("当前界面没有找到--【{}】元素".format(describe))
                else:
                    if self.poco_element_exists(element=element, timeout=timeout):
                        self.__poco(text=incident).set_text(inputtext)
                        self.__log.info("{}元素点击成功，并成功输入：{}".format(describe, inputtext))
                    else:
                        self.__log.warning("当前界面没有找到--【{}】元素".format(describe))
            except Exception as e:
                self.__log.error("{}步骤出现异常，异常原因：".format(describe) + str(e))
                # todo 缺少一个异常处理

    def get_text_content(self, element, timeout=5):
        '''
        获取文本内容
        :param element: 待操作元素
        :param text: 定位方式，默认为None
        :param name: 定位方式，默认为None
        :param msg: 待操作元素描述
        :param timeout: 超时时间
        :return:
        '''
        acquire = None
        incident = element.get("incident")
        describe = element.get("describe")
        method = element.get("method")
        with allure.step("通过{}元素，获取到：{}".format(describe, acquire)):
            try:
                if method == "name":
                    if self.poco_element_exists(element=element, timeout=timeout):
                        acquire = self.__poco(incident).get_text()
                        self.__log.info("通过{}元素，获取到：{}".format(describe, acquire))
                    else:
                        self.__log.warning("当前界面没有找到--【{}】元素".format(describe))
                else:
                    if self.poco_element_exists(element=element, timeout=timeout):
                        acquire = self.__poco(text=incident).get_text()
                        self.__log.info("通过{}元素，获取到：{}".format(describe, acquire))
                    else:
                        self.__log.warning("当前界面没有找到--【{}】元素".format(describe))
                return acquire
            except Exception as e:
                self.__log.error("{}步骤出现异常，异常原因：".format(describe) + str(e))
                # todo 缺少一个异常处理

    def the_direction_of_the_sliding(self, direction, frequency=1):
        '''
        执行滑动操作，以手机屏幕为中心圆点
        :param direction: 向什么方向滑动 left(左)，right(右)，up（上），below（下）
        :param frequency: 滑动多少次，默认1次
        :return:
        '''
        with allure.step("正在进行滑动操作，向{}滑动{}次".format(direction, frequency)):
            try:
                window_width, window_height = self.equipment.get_sccreen_size()
                for i in range(int(frequency)):
                    if direction == "left":
                        swipe((int(window_width / 1.2), int(window_height / 2)), (0, int(window_height / 2)))
                    elif direction == "right":
                        swipe((0, window_height / 2), (int(window_width / 1.2), int(window_height / 2)))
                    elif direction == "up":
                        swipe((window_width / 2, window_height / 2), (window_width / 2, 0))
                    elif direction == "below":
                        swipe(((window_width / 2, 0), window_width / 2, window_height / 2))
                    else:
                        self.__log.warning("方向输入有误，请检查参数")
                self.__log.info("正在进行滑动操作，向{}滑动{}次".format(direction, frequency))
            except Exception as e:
                # todo 缺少一个异常处理
                self.__log.error("滑动异常，错误原因：{}".format(e))

    def get_screenshot_file(self, img_name, msg=None):
        '''
        截取屏幕
        :param img_path: 图片文件名称
        :param msg: 操作描述
        :return: 返回保存图片路径
        '''
        img_path = img_name
        with allure.step("{}：截取屏幕操作,保存路径为：{}".format(msg, img_path)):
            try:
                snapshot(filename=img_path, msg=msg)
                self.__log.info("{}：截取屏幕成功，保存路径为：{}".format(msg, img_name))
                return img_path
            except Exception as e:
                self.__log.error("{}：截取屏幕失败，错误原因：{}".format(img_name, e))

    def get_snapshot_crop(self, coordinate, file_name, msg=None):
        '''
        区域截图（坐标定位）
        :param coordinate: 坐标  如：（91, 326, 988, 712） 元组传输
        :param file_name: 文件名称
        :param msg: 描述
        :return: 返回图片路径
        '''
        file_path = file_name
        with allure.step("{}：区域截图操作，保存路径为：{}".format(msg, file_path)):
            try:
                screen = G.DEVICE.snapshot()
                screens = aircv.crop_image(screen, coordinate)
                aircv.imwrite(file_path, screens)
                self.__log.info("{}：区域截图操作，保存路径为：{}".format(msg, file_path))
            except Exception as e:
                self.__log.error("{}：区域截图操作失败，错误原因：{}".format(msg, e))


if __name__ == '__main__':
    text = "我的"
    from common.util.log_util import GenerateLog
    from poco.drivers.android.uiautomation import AndroidUiautomationPoco

    poco = AndroidUiautomationPoco(use_airtest_input=True,
                                   screenshot_each_action=False)
    dirc = {'incident': 'com.sanqi.xingzhifuplus.test:id/tvCancel', 'describe': '登录流程：下次更新按钮', 'method': 'name'}
    print(PocoElement(poco, GenerateLog().logger()).poco_element_exists(dirc))
